import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;


public class ConjecturaCollatzPD{
	private HashSet<Long> seq;
	private List<Integer> input;
	
	
	public ConjecturaCollatzPD(List<Integer> input) {
		this.input = input;
	}

	public HashSet<Long> conjectura() {
		seq = new HashSet<Long>();
		for (int i = 0; i < this.input.size(); i++) {
			Long atual = (long) this.input.get(i);
			while(atual != 1) {
				if(seq.contains(atual)) {
					break;
				} else{
					seq.add(atual);
				}
				if(isEven(atual)) {
					atual = atual /2;
				}else{
					atual = (3*atual) +1;
				}
			}
			
		}
		return seq;
	}
	
	
	private boolean isEven(long number) {
		return number % 2 ==0;
	}
	
//	public static void main(String[] args) {
//		List<Integer> numeros = NumberGenerator.generateNumber(100000);
//		
//		ConjecturaCollatz conjectura = new ConjecturaCollatz(numeros);
//		System.out.println("Conjectura Collatz");
//		Long inicio = new GregorianCalendar().getTimeInMillis();
//		Map<Integer,String> result = conjectura.conjectura();
//		Long fim = new GregorianCalendar().getTimeInMillis();
////		for (Integer integer : result.keySet()) {
////			System.out.println(integer+ ": " + result.get(integer));
////		}
//		System.out.println("Início: " + inicio);
//		System.out.println("Fim: " + fim);
//		System.out.println(fim - inicio);
//		
//		System.out.println(result.keySet().size());
//		
//		
//		
//		ConjecturaCollatzPD conjecturaPD = new ConjecturaCollatzPD(numeros);
//		System.out.println("Conjectura CollatzPD");
//		inicio = new GregorianCalendar().getTimeInMillis();
//		Map<Long,String> result2 = conjecturaPD.conjectura();
//		fim = new GregorianCalendar().getTimeInMillis();
////		for (Long numero : result2.keySet()) {
////			System.out.println(numero+ ": " + result.get(numero));
////		}
//		System.out.println("Início: " + inicio);
//		System.out.println("Fim: " + fim);
//		System.out.println(fim - inicio);
//		
//		System.out.println(result2.keySet().size());
//	}

	public HashSet<Long> getSeq() {
		return seq;
	}

	public void setSeq(HashSet<Long> seq) {
		this.seq = seq;
	}
}
